﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Kontrolki;
using KPWeb.Class;
using KPWeb.Data;
using KPWeb.Function;
using KPWeb.Reports;
using MSExcel = Microsoft.Office.Interop.Excel;
//using Microsoft.Reporting.WebForms;


namespace KPWeb.Urlopy
{

    public partial class WniosekUrlopowy : KPPage
    {
        private short RodzajNarzedzia
        {

            get
            {
                return short.Parse(ViewState["RodzajNarzedzia"].ToString());
            }
            set
            {
                ViewState["RodzajNarzedzia"] = value;

            }
        }
        private void komunikatError(int kod)//, int iT, int iID)
        {
            fError.Visible = true;
            switch (kod)
            {
                case -1: Error1.Visible = true;
                    break;
                case -2: Error2.Visible = true;
                    break;
                case -3: Error3.Visible = true;
                    break;
                case -4: Error4.Visible = true;
                    break;
                case -5: Error5.Visible = true;
                    break;
                //case -6: Error6.Visible = true;
                //    break;
                default: fError.Visible = false;
                    break;
            }
        }


        public static vKP_DokumentyWnioskiUrlopowe[] GetWnioskiUrlopoweZarejestrowane(int osobaID)
        {
            using (DBContainer db = new DBContainer())
            {

                return (from wiz in db.vKP_DokumentyWnioskiUrlopowe.Where(a => a.OsobaID == osobaID && a.stan==6).OrderByDescending(a => a.OdData)
                        select wiz).ToArray();
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            fError.Visible = false;
            Error1.Visible = false;
            Error2.Visible = false;
            Error3.Visible = false;
            Error4.Visible = false;
            Error5.Visible = false;
            //Error6.Visible = false;

            RodzajNarzedzia = short.Parse(Request["value"]);
       
            if (!IsPostBack)
            {
                dTypUrlopu.Items.Clear();
                switch (RodzajNarzedzia)
                {
                    case 1://Urlopy
                        bInneNieobecnosciZapisz.Visible = false;
                        bWniosekUrlopowyElektroniczny.Visible = true;
                        bWniosekUrlopowyPapierowy.Visible = true;
                        foreach (vLex_TypNieobecnosciUrlopu u in UrlopyK.GetListaTypUrlopu().OrderBy(a => a.TypNieobecnosciUrlopuNazwa))
                            {
                                this.dTypUrlopu.Items.Add(new ListItem() { Text = u.TypNieobecnosciUrlopuNazwa, Value = u.TypNieobecnosciUrlopuID.ToString() });
                            }
                        dTypUrlopu.SelectedValue = Stale.urlopInic;
                        break;
                    case 2://Inne nieobecności
                        bInneNieobecnosciZapisz.Visible = true;
                        bWniosekUrlopowyElektroniczny.Visible = false;
                        bWniosekUrlopowyPapierowy.Visible = false;
                        foreach (vLex_TypNieobecnosciUrlopu u in UrlopyK.GetListaTypNieobecnosciNieUrlop().OrderBy(a => a.TypNieobecnosciUrlopuNazwa))
                            {
                                this.dTypUrlopu.Items.Add(new ListItem() { Text = u.TypNieobecnosciUrlopuNazwa, Value = u.TypNieobecnosciUrlopuID.ToString() });
                            }
                            dTypUrlopu.SelectedValue = Stale.nieobecnoscInic;
                        break;
                }
                this.CalendarUC1.AllowHolidaysChecking = true;
                this.CalendarUC1.DateStart = DateTime.Now.Date;

                UprawnieniaLogowanie upr = new UprawnieniaLogowanie();
                this.bWniosekUrlopowyElektroniczny.Enabled = !upr.CzyOsobaFunkcyjna(int.Parse(Current.OsobaID));

                List<DateTime> l = new List<DateTime>();
                foreach (var item in Kalendarz.GetSwieta(DateTime.Now.Date.Year))
                {
                    l.Add(new DateTime(item.year, item.month, item.day));
                }
                this.CalendarUC1.Holidays = l.ToArray();
                //   this.CalendarUC1.

                dOsobyZastepstwo.Items.Clear();
                dOsobyZastepstwo.Items.Add(new ListItem() { Text = Stale.wybierzZastepce, Value = "0" });
                Model model = new Model();
                //   IEnumerable<vKP_OsobyListaObecnosci> temp

                foreach (vKP_OsobyListaObecnosci item in model.GetListaObecnosci
                            (Model.GetJednostkaGlownaDlaJednostki(int.Parse(Current.JednostkaID))))
                {
                    if (item.OsobaID != int.Parse(Current.OsobaID))
                        dOsobyZastepstwo.Items.Add(
                            new ListItem() { Text = FunctionGlobal.UppercaseFirstWords(item.NazwiskoImie), Value = item.OsobaID.ToString() });

                }
              
                CalendarUC1.ClearSelected();

                //lYear.Items.Add("2013");

                //hYear.Value = lYear.SelectedValue;
                hOsobaID.Value = Current.OsobaID;


            }
            else
            {
                this.CalendarUC1.RenderCalendar();
                //int iDni = CalendarUC1.Selected.Count();
                //tZaznaczone.Text = iDni.ToString();
                //tRobocze.Text = Kalendarz.GetLiczbaDniRoboczych(CalendarUC1.Selected).ToString();
                tZaznaczone.Text = "";
                tRobocze.Text = "";
            }

        }


        protected int WniosekUrlopowWyswietlExcel()
        // 0 OK, 1 brak ciagłości okresu, 2 błąd wyboru typu urlopu
        {
            if (CalendarUC1.Selected.Count() == 0) return -3;

            DateTime[] dMinMax = Kalendarz.GetMinMaxOkresu(CalendarUC1.Selected);
            if (!sprawdzCiagloscOkresu(dMinMax[0], dMinMax[1])) return -1;

            MSExcel.Application excelApp = new MSExcel.Application();
            string filePath = Server.MapPath("~/EXCEL/SzWniosekUrlopowy.xls");


            MSExcel.Workbook excelWorkbook = excelApp.Workbooks.Open(filePath,
                    0, true, 5, "", "", false, MSExcel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);

            MSExcel.Sheets excelSheets = excelWorkbook.Worksheets;

            string currentSheet = "WniosekUrlopowy";
            MSExcel.Worksheet excelWorksheet = (MSExcel.Worksheet)excelSheets.get_Item(currentSheet);

            //nazwisko,imie
            MSExcel.Range excelCell = (MSExcel.Range)excelWorksheet.get_Range("B7", "B7");
            excelCell.Value = "Nazwisko imię";
            //jednostka
            excelCell = (MSExcel.Range)excelWorksheet.get_Range("B9", "B9");
            excelCell.Value = "Dział Informatyki";
            //Stanowisko
            excelCell = (MSExcel.Range)excelWorksheet.get_Range("B11", "B11");
            excelCell.Value = "Stanowisko";
            //dnia
            excelCell = (MSExcel.Range)excelWorksheet.get_Range("K7", "K7");
            excelCell.Value = String.Format("{0:yyyy-MM-dd}", DateTime.Now);
            //Od
            excelCell = (MSExcel.Range)excelWorksheet.get_Range("E28", "E28");
            excelCell.Value = dMinMax[0].ToShortDateString();
            //Do
            excelCell = (MSExcel.Range)excelWorksheet.get_Range("H28", "H28");
            excelCell.Value = dMinMax[1].ToShortDateString();
            //Liczba dni
            excelCell = (MSExcel.Range)excelWorksheet.get_Range("K28", "K28");
            excelCell.Value = tRobocze.Text;
            //Zastepstwo
            excelCell = (MSExcel.Range)excelWorksheet.get_Range("E31", "E31");
            excelCell.Value = dOsobyZastepstwo.SelectedValue;

            switch (dTypUrlopu.SelectedValue)
            {
                case "wypoczynkowy":
                    excelCell = (MSExcel.Range)excelWorksheet.get_Range("C22", "C22");
                    excelCell.Value = "X";
                    break;
                case "wypoczynkowy na żądanie":
                    excelCell = (MSExcel.Range)excelWorksheet.get_Range("F22", "F22");
                    excelCell.Value = "X";
                    break;
                case "szkoleniowy":
                    excelCell = (MSExcel.Range)excelWorksheet.get_Range("I22", "I22");
                    excelCell.Value = "X";
                    break;
                case "bezpłatny":
                    excelCell = (MSExcel.Range)excelWorksheet.get_Range("C25", "C25");
                    excelCell.Value = "X";
                    break;
                case "okolicznościowy":
                    excelCell = (MSExcel.Range)excelWorksheet.get_Range("F25", "F25");
                    excelCell.Value = "X";
                    break;
                case "z tytułu opieki nad dzieckiem": excelCell = (MSExcel.Range)excelWorksheet.get_Range("I25", "I25");
                    excelCell.Value = "X";
                    break;

                default: return -2;
            }

            excelApp.Visible = true;
            return 0;
        }

        protected int WniosekUrlopowUtworz(byte rodzaj)
        // 0 OK, 1 brak ciagłości okresu, 2 błą wyboru typu urlopu
        {
            if (CalendarUC1.Selected.Count() == 0) return -3;

            int iDni = CalendarUC1.Selected.Count();
            tZaznaczone.Text = iDni.ToString();
            tRobocze.Text = Kalendarz.GetLiczbaDniRoboczych(CalendarUC1.Selected).ToString();

            DateTime[] dMinMax = Kalendarz.GetMinMaxOkresu(CalendarUC1.Selected);
            int? iTemp = int.Parse(dOsobyZastepstwo.SelectedValue);
            iTemp = (iTemp == 0 ? null : iTemp);
            if (!sprawdzCiagloscOkresu(dMinMax[0], dMinMax[1])) return -1;

            int iT = UrlopyK.InsertWniosekUrlopowy(int.Parse(Current.OsobaID), byte.Parse(dTypUrlopu.SelectedValue),
                 iTemp, dMinMax[0], dMinMax[1], int.Parse(tRobocze.Text), rodzaj, 0);

            return iT; //Ostatni wiersz w procedurze
        }


        protected void WniosekUrlopowyElektroniczny_Click(object sender, System.EventArgs e)
        {
            // 1 elektroniczny
            if (dOsobyZastepstwo.SelectedItem.Text == Stale.wybierzZastepce && dTypUrlopu.SelectedValue != Stale.urlopNaZadanie)
            {
                komunikatError(-5);
                return;
            }

            int iTemp = WniosekUrlopowUtworz(1);

            if (iTemp < 0) komunikatError(iTemp); //Ostatni wiersz w procedurze
        }
        protected void WniosekUrlopowyPapierowy_Click(object sender, System.EventArgs e)
        {
            //2 papierowy
            int iTemp = WniosekUrlopowUtworz(2);

            if (iTemp < 0) komunikatError(iTemp); //Ostatni wiersz w procedurze
        }

        //protected void urlopRLBRoboczy_Click(object sender, System.EventArgs e)
        //{
        //    string sTemp = ((KPWeb.Kontrolki.RaportLinkButton)sender).CommandArgument.ToString();
        //    for (int i = sTemp.Length; i < Stale.countDigitsInBarCode - 2; i++)
        //    {
        //        sTemp = "0" + sTemp;
        //    }
        //    sTemp = Stale.idWU + sTemp;
        //    RaportyPDF.RaportWniosekUrlopowyBarCodePDF(int.Parse(sTemp),0);
        //}
        protected void urlopRLBOryginal_Click(object sender, System.EventArgs e)
        {
            string sTemp = ((KPWeb.Kontrolki.RaportLinkButton)sender).CommandArgument.ToString();
            for (int i = sTemp.Length; i < Stale.countDigitsInBarCode - 2; i++)
            {
                sTemp = "0" + sTemp;
            }
            sTemp = Stale.idWU + sTemp;

            RaportyPDF.RaportWniosekUrlopowyBarCodePDF(int.Parse(sTemp), 1);

        }

        //}
        //protected void CalendarUC1_UserControlRefreshedE(object sender, CalendarUC.ActionEvent e)
        //{
        //    //tutaj odswiez u siebie dni

        //    int iDni = CalendarUC1.Selected.Count();
        //    tZaznaczone.Text = iDni.ToString();
        //    tRobocze.Text = Kalendarz.GetLiczbaDniRoboczych(CalendarUC1.Selected).ToString();

        //    if (e.ActionType == CalendarUC.ActionType.NextPrevMonth || e.ActionType == CalendarUC.ActionType.PageLoad)
        //    {
        //        this.CalendarUC1.ClearUnavailablePeriods();
        //        DateTime since = new DateTime(this.CalendarUC1.SingleMonthDate.Year, this.CalendarUC1.SingleMonthDate.Month, 1);
        //        DateTime until = new DateTime(since.Year, since.Month, DateTime.DaysInMonth(since.Year, since.Month));

        //        DateTime zatrOd = DateTime.Parse(Current.DataZatrudnieniaOd);
        //        DateTime zatrDo = DateTime.Parse(Current.DataZatrudnieniaDo);

        //        if (zatrOd > since && zatrOd > until || zatrDo < since && zatrDo < until) this.CalendarUC1.AddUnavailablePeriod(since, until);
        //             else
        //                  if (zatrOd > since && zatrOd < until)  this.CalendarUC1.AddUnavailablePeriod(since, zatrOd.AddDays(-1));

        //        if (zatrDo > since && zatrDo < until) this.CalendarUC1.AddUnavailablePeriod(zatrDo.AddDays(1),until);
        //   }
        //}
        protected void CalendarUC_UserControlRefreshedE(object sender, CalendarUC.ActionEvent e)
        {
            //tutaj odswiez u siebie dni
            if (sender == null) return;
            int iDni = (sender as CalendarUC).Selected.Count();
            tZaznaczone.Text = iDni.ToString();
            tRobocze.Text = Kalendarz.GetLiczbaDniRoboczych((sender as CalendarUC).Selected).ToString();

            if (e.ActionType == CalendarUC.ActionType.NextPrevMonth || e.ActionType == CalendarUC.ActionType.PageLoad)
            {
                this.CalendarUC1.ClearUnavailablePeriods();
                DateTime since = new DateTime((sender as CalendarUC).DateStart.Year, (sender as CalendarUC).DateStart.Month, 1);
                DateTime until = new DateTime(since.Year, since.Month, DateTime.DaysInMonth(since.Year, since.Month));

                DateTime zatrOd = DateTime.Parse(Current.DataZatrudnieniaOd);
                DateTime zatrDo = DateTime.Parse(Current.DataZatrudnieniaDo);

                if (zatrOd > since && zatrOd > until || zatrDo < since && zatrDo < until) (sender as CalendarUC).AddUnavailablePeriod(since, until);
                else
                    if (zatrOd > since && zatrOd < until) (sender as CalendarUC).AddUnavailablePeriod(since, zatrOd.AddDays(-1));
                if (zatrDo > since && zatrDo < until) (sender as CalendarUC).AddUnavailablePeriod(zatrDo.AddDays(1), until);
            }
        }
        protected void bDaty_Click(object sender, EventArgs e)
        {
            zaznaczDniCalendar(DateTime.Parse(tDataOd.Text), DateTime.Parse(tDataDo.Text));
        }

        protected void tData_Click(object sender, EventArgs e)
        {
            DateTime dd1;
            DateTime dd2;
            CalendarUC1.ClearSelected();
            if (DateTime.TryParse(tDataOd.Text, out dd1) && DateTime.TryParse(tDataDo.Text, out dd2))
                zaznaczDniCalendar(dd1, dd2);
        }

        protected bool sprawdzCiagloscOkresu(DateTime d1, DateTime d2)
        {
            for (DateTime d = d1; d <= d2; d = d.AddDays(1))
            {
                if (CalendarUC1.Selected.Where(a => a.Date == d).Count() == 0) return false;
            }
            return true;
        }
        protected void zaznaczDniCalendar(DateTime d1, DateTime d2)
        {
            CalendarUC1.ClearSelected();

            List<DateTime> l = new List<DateTime>();
            for (DateTime d = d1; d <= d2; d = d.AddDays(1))
            {
                l.Add(new DateTime(d.Year, d.Month, d.Day));
            }
            CalendarUC1.Selected = l.ToArray();


            //       ViewState["Dates"] = CalendarUC1.Selected;


            tZaznaczone.Text = CalendarUC1.Selected.Count().ToString();
            tRobocze.Text = Kalendarz.GetLiczbaDniRoboczych(CalendarUC1.Selected).ToString();

        }

        protected void btnKasujClick(object sender, EventArgs e)
        {
            int outProc = UrlopyK.DeleteWniosekUrlopowy(
                           int.Parse(((Button)sender).CommandArgument.ToString()));
            if (outProc != 0) Error2.Visible = true;
            this.ListView1.DataBind();

        }

        protected void btnDoKadrClick(object sender, EventArgs e)
        {
            int outProc = UrlopyK.UpdateWniosekUrlopowy(
                          int.Parse(((Button)sender).CommandArgument.ToString()), 0, 1);
            if (outProc != 0) Error2.Visible = true;
            this.ListView1.DataBind();

        }

        protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e)
        {
            string sTemp = ((Label)e.Item.FindControl("Zastepstwo")).Text;

            ((Label)e.Item.FindControl("Zastepstwo")).Text = FunctionGlobal.UppercaseFirstWords(sTemp);
        }

    }
}